package org.tissou.client.Panel_Premier.dettes_tab;

import org.tissou.client.Interface.Base_Panel;
import org.tissou.client.Services.*;
import org.tissou.client.Services.RecuperationDonneesService.RecuperateurDonneesServices;
import org.tissou.client.DonneesAAfficher.*;
import org.tissou.client.widgets.Label_MessageInformation;
import com.google.gwt.user.client.ui.*;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;

import java.util.Date;


/**
 * Created by IntelliJ IDEA.
 * User: Claire
 * Date: 27-Apr-2009
 * Time: 22:40:57
 * To change this template use File | Settings | File Templates.
 */
public class TAB_Dettes extends Base_Panel {
  DockPanel principal = new DockPanel();

  DockPanel panel_monnaies = new DockPanel();
  Label label_monnaies = new Label("Choisissez votre monnaie");
  ArbreDeMonnaies arbremonnaies = new ArbreDeMonnaies();
  

  MonnaieInfos monnaie;
  Boolean monnaieselectionnee = false;

  DockPanel panel_categories = new DockPanel();
  Label label_categories = new Label("Choisissez votre categorie");
  ArbreDeCategories arbrecategories = new ArbreDeCategories();
  CategorieInfos categorie;
  Boolean categorieselectionnee = false;

  Donnees_Base donnees_dettes;
  DockPanel panel_dettes = new DockPanel();
  
  DockPanel panel_dettes_precises = new DockPanel();

  Label_MessageInformation message_information = new Label_MessageInformation();

  protected void MiseEnPlaceStyles() {
    panel_monnaies.addStyleName("dockPanelMonnaies");
    panel_categories.addStyleName("dockPanelCategories");
    panel_dettes.addStyleName("dockPanelDettes");
    panel_dettes_precises.addStyleName("dockPanelDettes");
  }

  protected void MiseEnPlaceParametresWidgets() {

  }

  protected void MiseEnPlaceParametresPanel() {
    panel_monnaies.add(label_monnaies, DockPanel.NORTH);
    panel_monnaies.add(arbremonnaies, DockPanel.NORTH);
    panel_categories.add(label_categories, DockPanel.NORTH);
    panel_categories.add(arbrecategories, DockPanel.NORTH);
  }

  protected void MiseEnPlaceActions() {
    arbremonnaies.addTreeListener(new TreeListener(){
      public void onTreeItemSelected(TreeItem item) {

        try { monnaie = arbremonnaies.donneLaMonnaieSelectionnee();
        } catch (MonException e){
          message_information.setMessage(Label_MessageInformation.Etat.MAUVAISEENTREE, e.getMessage());
          throw e;
        }

        monnaieselectionnee = true;
        if (monnaieselectionnee&&categorieselectionnee){
          AfficherLaTableDesDettes(monnaie,categorie);
        }
      }

      public void onTreeItemStateChanged(TreeItem item) {

      }
    });

    arbrecategories.addTreeListener(new TreeListener(){

      public void onTreeItemSelected(TreeItem item) {
        categorie = arbrecategories.donneLaCategorieSelectionnee();
        categorieselectionnee = true;
        if (monnaieselectionnee&&categorieselectionnee){
          AfficherLaTableDesDettes(monnaie,categorie);
        }
      }

      public void onTreeItemStateChanged(TreeItem item) {
      }
    }
    );
  }

  private void AfficherLaTableDesDettes(MonnaieInfos monnaie, CategorieInfos categorie){
    ParametresQuery parametres = new ParametresQuery.Builder()
        .addProprietaires(InformationsGlobales.personneLoguee)
        .addCategorie(categorie)
        .addMonnaie(monnaie)
        .setType(TypeDonnee.DETTES)
        .build();

    panel_dettes_precises.clear();

    ClickHandler clickSurLeTableauHandler = new ClickHandler() {
      @Override
      public void onClick(ClickEvent event) {
        int row = ((Tableau)event.getSource()).getCellForEvent(event).getRowIndex();
        // TODO(manu): Roo ca c'est vraiment bien pourrite, on devrait pouvoir faire mieux.

        panel_dettes_precises.clear();
        Element_Tiers tiers = (Element_Tiers) ((Tableau)event.getSource()).getElement(row, 0);
        recupererDesPrecisionsSurLaDetteAvecQuelquun(tiers.getTiers());
      }
    };
    RecuperateurAfficheurDonnees recuperateur = new RecuperateurAfficheurDonnees(parametres, panel_dettes,
        message_information, clickSurLeTableauHandler);
    recuperateur.recupererEtAfficherDonnees();
  }

  private void recupererDesPrecisionsSurLaDetteAvecQuelquun(ProprietaireInfos avecQui){
    recupererDesPrecisionsSurLaDetteAvecQuelquun(avecQui, monnaie,  categorie);
  }

  private void recupererDesPrecisionsSurLaDetteAvecQuelquun(ProprietaireInfos avecQui, MonnaieInfos monnaie, CategorieInfos categorie) {
    ParametresQuery parametres = new ParametresQuery.Builder()
        .addProprietaires(InformationsGlobales.personneLoguee)
        .addProprietaires(avecQui)
        .addCategorie(categorie)
        .addMonnaie(monnaie)
        .setType(TypeDonnee.LIGNECOMPTEVIRTUEL)
        .setNombredeligne(25)
        .setOffset(0)
        .addDate(new Date())
        .build();

    RecuperateurAfficheurDonnees recuperateur = new RecuperateurAfficheurDonnees(parametres, panel_dettes_precises,
        message_information);
    recuperateur.recupererEtAfficherDonnees();
  }


  protected void MiseEnPlacePanels() {
    principal.add(message_information, DockPanel.NORTH);
    principal.setCellHeight(message_information, "40px");
    principal.setCellHorizontalAlignment(message_information,HasHorizontalAlignment.ALIGN_CENTER);
    principal.add(panel_monnaies, DockPanel.WEST);
    principal.setCellWidth(panel_monnaies, "150px");
    principal.setCellHorizontalAlignment(panel_monnaies, HasHorizontalAlignment.ALIGN_LEFT);
    principal.add(panel_categories, DockPanel.WEST);
    principal.setCellWidth(panel_categories, "250px");
    principal.setCellHorizontalAlignment(panel_monnaies, HasHorizontalAlignment.ALIGN_LEFT);
    principal.add(panel_dettes, DockPanel.WEST);
    principal.setCellWidth(panel_dettes, "160px");
    principal.setCellHorizontalAlignment(panel_monnaies, HasHorizontalAlignment.ALIGN_LEFT);
    principal.add(panel_dettes_precises, DockPanel.WEST);
    principal.setCellWidth(panel_dettes_precises, "635px");
    principal.setCellHorizontalAlignment(panel_monnaies, HasHorizontalAlignment.ALIGN_LEFT);
  }

  protected Panel donneLePanelPrincipal() {
    return principal;  
  }
}
